package 算法;

import com.sun.org.apache.xpath.internal.operations.String;

import java.util.HashMap;
import java.util.Map;

/**
 * &：按位与。对应位如果相同下移
 *      10 & 4 == 0b1010 & 0b100 = 0b0
 * |：按位或。 对应位只要有一个1下移为1
 *      10 ｜ 4 == 0b1010 ｜ 0b100 = 0b1110
 * ~：按位非。 反转后前边自动补1
 *      ~ob100 == 11111111111011
 * ^：按位异或。 对应位不同下移1
 *      10 ^ 4 == 0b1010 ^ 0b100 = 0b1110
 * <<：左位移运算符。 移动一位相当于乘2
 *      10 << 2 == 0b1010 << 2 == 0b101000
 * >>：右位移运算符。移动一位相当于除2,正是这个原因，整数除2还是整数
 *      10 >> 2 == 0b1010 >> 2 == 0b10
 * <<<：无符号右移运算符。
 *
 *
 */
public class 位运算 {
    public static void main(String[] args) {
        int a=2;
        int b=2;
        int aResult;
        int bResult;
        long startTime;
        long endTime;
        long time;

        //乘法运算
        startTime=System.currentTimeMillis();
        for(long i=0;i<2500000000L;i++){
            bResult=b*1024;
        }
        endTime=System.currentTimeMillis();
        time=endTime-startTime;
        System.out.println("乘法250000000次时间："+time);

        //位运算
        System.out.println(Integer.toBinaryString(1024));
        startTime=System.currentTimeMillis();
        for(long i=0;i<2500000000L;i++){
            aResult=a<<10;
        }
        endTime=System.currentTimeMillis();
        time=endTime-startTime;
        System.out.println("位移100000000次时间："+time);
    }

    int pow(int m,int n){
        int sum = 1;
        int tmp = m;
        while(n != 0){
            int i = n & 1;
            if((n & 1) == 1){
                sum *= tmp;
            }
            tmp *= tmp;
            n = n >> 1;
        }

        return sum;
    }
}
